home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 112 / EnigmaAmiga112CD.iso / dalla rivista / news / orbit / source / keyboard.c < prev    next >
C/C++ Source or Header  |  2000-05-01  |  13KB  |  707 lines

  1. /*
  2.     Amiga port by Oliver Gantert
  3.  
  4.     27.04.2000 - fixed some compiler warnings
  5.     28.04.2000 - fixed a problem with key states
  6.                  left pitch roll assigned to <,>
  7.                  right pitch roll assigned to <.>
  8.                  cursor movement more precise (0.5 instead of 1.0)
  9.     30.04.2000 - added FreeJoy() call to quit keys
  10. */
  11. /*
  12.  
  13. ORBIT, a freeware space combat simulator
  14. Copyright (C) 1999  Steve Belczyk <steve1@genesis.nred.ma.us>
  15.  
  16. This program is free software; you can redistribute it and/or
  17. modify it under the terms of the GNU General Public License
  18. as published by the Free Software Foundation; either version 2
  19. of the License, or (at your option) any later version.
  20.  
  21. This program is distributed in the hope that it will be useful,
  22. but WITHOUT ANY WARRANTY; without even the implied warranty of
  23. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  24. GNU General Public License for more details.
  25.  
  26. You should have received a copy of the GNU General Public License
  27. along with this program; if not, write to the Free Software
  28. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  29.  
  30. */
  31.  
  32. #include "orbit.h"
  33.  
  34. char key[256], spec[256];
  35.  
  36. static void Key (unsigned char k, int x, int y)
  37. {
  38.   /* Are we reading in some text? */
  39.   if (text.yes)
  40.   {
  41.     if ( ((k == 127) || (k == 8)) && (text.index > 0) )  /* Backspace */
  42.     {
  43.       text.index--;
  44.       text.buf[text.index] = 0;
  45.       Mprint ("%s%s", text.prompt, text.buf);
  46.       return;
  47.     }
  48.     if (k == 27) /* Escape */
  49.     {
  50.       text.yes = 0;
  51.       Mprint (" ");
  52.       return;
  53.     }
  54.     else if (k == 13) /* Return */
  55.     {
  56.       Mprint (" ");
  57.       text.func();
  58.       text.yes = 0;
  59.       return;
  60.     }
  61.     else
  62.     {
  63.       /* Add character to buffer */
  64.       if (text.index >= (TEXTSIZE-1))
  65.       {
  66.         text.func();
  67.         text.yes = 0;
  68.         return;
  69.       }
  70.       text.buf[text.index++] = k;
  71.       text.buf[text.index] = 0;
  72.       Mprint ("%s%s", text.prompt, text.buf);
  73.       return;
  74.     }
  75.   }
  76.  
  77.   if (state == STATE_DEAD1) return;
  78.  
  79.   if (state == STATE_DEAD2)
  80.   {
  81.     state = STATE_NORMAL;
  82.     Mprint (" ");
  83.     return;
  84.   }
  85.  
  86.   if (paused)
  87.   {
  88.     paused = 0;
  89.     Mprint ("");
  90.     if ( (state != STATE_LOADGAME) ||
  91.     (k < '0') ||
  92.     (k >= '0'+nsaves) )
  93.     {
  94.       if (state == STATE_LOADGAME) state = STATE_NORMAL;
  95.       return;
  96.     }
  97.   }
  98.   key[k] = 0x81;
  99. }
  100.  
  101. static void KeyUp (unsigned char k, int x, int y)
  102. {
  103.   key[k] &= 0x7f;
  104.  
  105.   if (k == 'a') key['A'] &= 0x7f;
  106.   if (k == 'z') key['Z'] &= 0x7f;
  107.   if (k == 'A') key['a'] &= 0x7f;
  108.   if (k == 'Z') key['z'] &= 0x7f;
  109. }
  110.  
  111. static void Spec (int k, int x, int y)
  112. {
  113.   if (state == STATE_DEAD1) return;
  114.  
  115.   if (state == STATE_DEAD2)
  116.   {
  117.     state = STATE_NORMAL;
  118.     return;
  119.   }
  120.  
  121.   if (paused)
  122.   {
  123.     paused = 0;
  124.     Mprint ("");
  125.     return;
  126.   }
  127.   spec[k] = 0x81;
  128. }
  129.  
  130. static void SpecUp (int k, int x, int y)
  131. {
  132.   spec[k] &= 0x7f;
  133. }
  134.  
  135. int KeyState (int k)
  136. /*
  137.  *  bit 7 will be set if key is down now
  138.  *  bit 0 will be set if key has been pressed since last time
  139.  *        we were asked
  140.  */
  141. {
  142.   int j;
  143.  
  144.   j = key[k];
  145.  
  146.   /* Clear since-last-time bit */
  147. #ifndef AMIGA
  148.   key[k] &= 0xfe;
  149. #else
  150.   key[k] = 0;
  151. #endif /* AMIGA */
  152.  
  153.   return (j);
  154. }
  155.  
  156. int SpecKeyState (int k)
  157. /*
  158.  *  bit 7 will be set if key is down now
  159.  *  bit 0 will be set if key has been pressed since last time
  160.  *        we were asked
  161.  */
  162. {
  163.   int j;
  164.  
  165.   j = spec[k];
  166.  
  167.   /* Clear since-last-time bit */
  168. #ifndef AMIGA
  169.   spec[k] &= 0xfe;
  170. #else
  171.   spec[k] = 0;
  172. #endif /* AMIGA */
  173.  
  174.   return (j);
  175. }
  176.  
  177. void InitKeyboard()
  178. /*
  179.  *  Initialize the keyboard
  180.  */
  181. {
  182.   int i;
  183.  
  184.   /* Clear all the key-pressed flags */
  185.   for (i=0; i<256; i++)
  186.   {
  187.     key[i] = 0;
  188.     spec[i] = 0;
  189.   }
  190.  
  191.   /* Set up call backs */
  192.   glutKeyboardFunc (Key);
  193.   glutSpecialFunc (Spec);
  194.   glutKeyboardUpFunc (KeyUp);
  195.   glutSpecialUpFunc (SpecUp);
  196. }
  197.  
  198. void Keyboard()
  199. /*
  200.  *  Read the keyboard
  201.  */
  202. {
  203.   int k, i;
  204.  
  205.   /* If we're waiting for Sparky to hit a key to load a game,
  206.     check the appropriate digit keys */
  207.   if (state == STATE_LOADGAME)
  208.   {
  209.     for (k=0; k<nsaves; k++)
  210.     {
  211.       if (1 & KeyState ('0' + k))
  212.       LoadGameByKey (k);
  213.     }
  214.   }
  215.  
  216.   if (KeyState (27)) /* Escape */
  217.   {
  218.     if (strcasecmp (gamemode, "no")) glutLeaveGameMode();
  219.  
  220.     /* Rewrite the preferences file before leaving */
  221.     Log ("Escape key, exiting...");
  222.     ShutdownNetwork();
  223.     FinishSound();
  224.     WritePrefs();
  225.     CloseLog();
  226. #ifdef AMIGA
  227.     FreeJoy();
  228. #endif
  229.     exit (0);
  230.   }
  231.  
  232.   if (KeyState ('q'))
  233.   {
  234.     if (strcasecmp (gamemode, "no")) glutLeaveGameMode();
  235.     Log ("Quitting...");
  236.     ShutdownNetwork();
  237.     FinishSound();
  238.     WritePrefs();
  239.     CloseLog();
  240. #ifdef AMIGA
  241.     FreeJoy();
  242. #endif
  243.     exit (0);
  244.   }
  245.  
  246.   if (KeyState ('Q'))
  247.   {
  248.     if (strcasecmp (gamemode, "no")) glutLeaveGameMode();
  249.     Log ("Quitting. no save...");
  250.     ShutdownNetwork();
  251.     FinishSound();
  252.     CloseLog();
  253. #ifdef AMIGA
  254.     FreeJoy();
  255. #endif
  256.     exit (0);
  257.   }
  258.  
  259.   player.move_right =
  260.   player.move_left =
  261.   player.move_up =
  262.   player.move_down =
  263.   player.move_forward =
  264.   player.move_backward =
  265.   player.move_pitchleft =
  266.   player.move_pitchright = 0.0;
  267.   warpspeed = 0;
  268.  
  269.   if (SpecKeyState (GLUT_KEY_RIGHT))  player.move_right = 0.5;
  270.   if (SpecKeyState (GLUT_KEY_LEFT))   player.move_left = 0.5;
  271.   if (SpecKeyState (GLUT_KEY_UP))     player.move_up = 0.5;
  272.   if (SpecKeyState (GLUT_KEY_DOWN))   player.move_down = 0.5;
  273.   if (KeyState('a'))                  player.move_forward = 0.75;
  274.   if (KeyState('z'))                  player.move_backward = 0.75;
  275.   if (KeyState(','))                  player.move_pitchleft = 1.0;
  276.   if (KeyState('.'))                  player.move_pitchright = 1.0;
  277.  
  278.   if (KeyState ('A'))
  279.   {
  280.     player.move_forward = 0.75;
  281.     warpspeed = 1;
  282.   }
  283.  
  284.   if (KeyState ('Z'))
  285.   {
  286.     player.move_backward = 0.75;
  287.     warpspeed = 1;
  288.   }
  289.  
  290.   if (1 & KeyState ('h'))
  291.   {
  292.     drawhud = !drawhud;
  293.   }
  294.  
  295.   if (1 & KeyState ('s'))
  296.   {
  297.     switch (starfield)
  298.     {
  299.       case 0: starfield = 1;
  300.       star_list = star_list_sparse;
  301.       Cprint ("SPARSE Starfield");
  302.       break;
  303.  
  304.       case 1: starfield = 2;
  305.       star_list = star_list_dense;
  306.       Cprint ("DENSE Starfield");
  307.       break;
  308.  
  309.       case 2: starfield = 0;
  310.       Cprint ("Starfield OFF");
  311.       break;
  312.     }
  313.   }
  314.  
  315.   if (1 & KeyState (' '))
  316.   {
  317.     if (fullstop)
  318.     {
  319.       player.vel[0] = player.vel[1] = player.vel[2] = 0.0;
  320.       player.throttle = 0.0;
  321.       if (am_client) clientme.urgent = 1;
  322.       QueuePositionReport();
  323.     }
  324.   }
  325.  
  326.   if (1 & KeyState ('c'))
  327.   {
  328.     for (i=0; i<console.next; i++) console.age[i] = 0.0;
  329.   }
  330.  
  331.   if (1 & KeyState ('g'))
  332.   {
  333.     if (!am_client)
  334.     {
  335.       gravity = !gravity;
  336.       if (gravity)
  337.       {
  338.         Cprint ("Gravity ON");
  339.       }
  340.       else
  341.       {
  342.         Cprint ("Gravity OFF");
  343.       }
  344.       if (am_server) SendFlags();
  345.     }
  346.   }
  347.  
  348.   if (1 & KeyState ('j'))
  349.   {
  350.     junk = !junk;
  351.     if (junk)
  352.     Cprint ("Space junk ON");
  353.     else
  354.     Cprint ("Space junk OFF");
  355.   }
  356.  
  357.   if (1 & KeyState ('T'))
  358.   {
  359.     joy_throttle = !joy_throttle;
  360.     if (joy_throttle)
  361.     Cprint ("Joystick throttle ON");
  362.     else
  363.     Cprint ("Joystick throttle OFF");
  364.   }
  365.  
  366.   if (1 & KeyState ('e'))
  367.   {
  368.     sound = !sound;
  369.     if (sound)
  370.     Cprint ("Sound effects ON");
  371.     else
  372.     Cprint ("Sound effects OFF");
  373.   }
  374.  
  375.   if (1 & KeyState ('i'))
  376.   {
  377.     if (!am_client && !am_server)
  378.     {
  379.       vulnerable = !vulnerable;
  380.       if (vulnerable)
  381.       Cprint ("Vulnerable");
  382.       else
  383.       Cprint ("Invulnerable");
  384.     }
  385.   }
  386.  
  387.   if (1 & KeyState ('P'))
  388.   {
  389.     ScreenShot();
  390.   }
  391.  
  392.   if (1 & KeyState ('n'))
  393.   {
  394.     show_names = !show_names;
  395.     if (show_names)
  396.     Cprint ("Names ON");
  397.     else
  398.     Cprint ("Names OFF");
  399.   }
  400.  
  401.   if (1 & KeyState ('m'))
  402.   {
  403.     if (message.age < MSG_MAXAGE)
  404.     message.age = MSG_MAXAGE + 1.0;
  405.     else
  406.     message.age = 0.0;
  407.   }
  408.  
  409.   if (1 & KeyState ('x'))
  410.   {
  411.     textures = !textures;
  412.     if (textures)
  413.     Cprint ("Textures ON");
  414.     else
  415.     Cprint ("Textures OFF");
  416.   }
  417.  
  418.   if (1 & KeyState ('r'))
  419.   {
  420.     rings = !rings;
  421.     if (rings)
  422.     Cprint ("Rings ON");
  423.     else
  424.     Cprint ("Rings OFF");
  425.   }
  426.  
  427.   if (1 & KeyState ('u')) LockNearest();
  428.  
  429.   if (1 & KeyState ('y')) LockNext();
  430.  
  431.   if (1 & KeyState ('Y')) LockPrev();
  432.  
  433.   if (1 & KeyState ('b'))
  434.   {
  435.     if (!am_client && !am_server) Mprint (mission.briefing);
  436.   }
  437.  
  438.   if (1 & KeyState ('w'))
  439.   {
  440.     player.weapon = (player.weapon + 1) % NPLAYER_WEAPONS;
  441.   }
  442.  
  443.   if (1 & KeyState ('W'))
  444.   {
  445.     player.weapon = (player.weapon + NPLAYER_WEAPONS - 1) %
  446.     NPLAYER_WEAPONS;
  447.   }
  448.  
  449.   if (1 & KeyState ('1')) player.weapon = 0;
  450.   if (1 & KeyState ('2')) player.weapon = 1;
  451.   if (1 & KeyState ('3')) player.weapon = 2;
  452.   if (1 & KeyState ('4')) player.weapon = 3;
  453.  
  454.   if (1 & KeyState ('p'))
  455.   {
  456.     if (!am_client && !am_server)
  457.     {
  458.       Mprint ("Paused");
  459.       paused = 1;
  460.     }
  461.   }
  462.  
  463.   /* Control-P for silent pause */
  464.   if (1 & KeyState (16))
  465.   {
  466.     if (!am_client && !am_server) paused = 1;
  467.   }
  468.  
  469.   if (1 & KeyState ('M'))
  470.   {
  471.     mouse_control = !mouse_control;
  472.     if (mouse_control)
  473.     {
  474.       Cprint ("Mouse ON");
  475.       InitMouse();
  476.     }
  477.     else
  478.     {
  479.       Cprint ("Mouse OFF");
  480.       glutSetCursor (GLUT_CURSOR_INHERIT);
  481.     }
  482.   }
  483.  
  484.   if (KeyState ('\t')) PlayerFires();
  485.  
  486.   if (1 & KeyState ('l'))
  487.   {
  488.     lock.type = (lock.type + 1) % 3;
  489.     lock.target = -1;
  490.     LockNearest();
  491.  
  492.     switch (lock.type)
  493.     {
  494.       case LOCK_ENEMY:
  495.       Cprint ("Locking ENEMIES");
  496.       break;
  497.  
  498.       case LOCK_FRIENDLY:
  499.       Cprint ("Locking FRIENDLIES");
  500.       break;
  501.  
  502.       case LOCK_PLANET:
  503.       Cprint ("Locking PLANETS");
  504.       break;
  505.     }
  506.   }
  507.  
  508.   if (1 & KeyState ('f'))
  509.   {
  510.     if (!am_client)
  511.     {
  512.       player.flightmodel = (player.flightmodel + 1) % 2;
  513.  
  514.       if (player.flightmodel == FLIGHT_NEWTONIAN)
  515.       Cprint ("NEWTONIAN flight model");
  516.       else
  517.       Cprint ("ARCADE flight model");
  518.  
  519.       if (am_server) SendFlags();
  520.     }
  521.   }
  522.  
  523.   if (1 & KeyState ('L'))
  524.   {
  525.     if (!am_client && !am_server) LoadGame();
  526.   }
  527.  
  528.   if (1 & KeyState (']')) NextWaypoint();
  529.   if (1 & KeyState ('[')) PrevWaypoint();
  530.  
  531.   if (1 & KeyState ('F'))
  532.   {
  533.     showfps = !showfps;
  534.  
  535.     if (showfps)
  536.     Cprint ("Framerate ON");
  537.     else
  538.     Cprint ("Framerate OFF");
  539.   }
  540.  
  541.   if (1 & KeyState ('S'))
  542.   {
  543.     if (am_client)
  544.     {
  545.       Mprint ("Alread a client");
  546.     }
  547.     else if (am_server)
  548.     {
  549.       ShutdownServer();
  550.     }
  551.     else
  552.     {
  553.       BecomeServer();
  554.     }
  555.   }
  556.  
  557.   if (1 & KeyState ('C'))
  558.   {
  559.     if (am_client)
  560.     {
  561.       ShutdownClient();
  562.     }
  563.     else if (am_server)
  564.     {
  565.       Mprint ("Already a server");
  566.     }
  567.     else
  568.     {
  569.       GetText ("Connect to: ", DoConnect);
  570.     }
  571.   }
  572.  
  573.   if (1 & KeyState ('U')) ShowClients();
  574.   if (1 & SpecKeyState (GLUT_KEY_F1)) ShowClients();
  575.  
  576.   if (1 & KeyState ('>'))
  577.   {
  578.     if (fov < 180.0)
  579.     {
  580.       fov += 5.0;
  581.       Reshape (ScreenWidth, ScreenHeight);
  582.     }
  583.     Cprint ("Field of view %3.0lf", fov);
  584.   }
  585.  
  586.   if (1 & KeyState ('<'))
  587.   {
  588.     if (fov > 5.0)
  589.     {
  590.       fov -= 5.0;
  591.       Reshape (ScreenWidth, ScreenHeight);
  592.     }
  593.     Cprint ("Field of view %3.0lf", fov);
  594.   }
  595.  
  596.   if (1 & KeyState ('t'))
  597.   {
  598.     GetText ("Say: ", DoChat);
  599.   }
  600.  
  601.   if (1 & KeyState (4)) /* control-D */
  602.   {
  603.     if (am_server) GetText ("Drop client: ", DoDrop);
  604.   }
  605.  
  606.   if (1 & KeyState (12)) /* control-L */
  607.   {
  608.     if (!am_server && !am_client) GetText ("Load mission: ", DoLoad);
  609.   }
  610.  
  611.   if (1 & KeyState (14)) /* control-N */
  612.   {
  613.     if (!am_client && !am_server)
  614.     {
  615.       GetText ("Player name: ", DoName);
  616.     }
  617.   }
  618.  
  619.   if (1 & KeyState ('o'))
  620.   {
  621.     draw_orbits = !draw_orbits;
  622.  
  623.     if (draw_orbits)
  624.     Cprint ("Orbits ON");
  625.     else
  626.     Cprint ("Orbits OFF");
  627.   }
  628.  
  629.   if (1 & KeyState ('O'))
  630.   {
  631.     if (!am_client && !am_server)
  632.     {
  633.       orbit = !orbit;
  634.  
  635.       if (orbit)
  636.       Cprint ("Orbiting ON");
  637.       else
  638.       Cprint ("Orbiting OFF");
  639.     }
  640.   }
  641.  
  642.   if (1 & KeyState ('k'))
  643.   {
  644.     if (!am_client && !am_server)
  645.     {
  646.       compression *= 2.0;
  647.       PrintCompression();
  648.     }
  649.   }
  650.  
  651.   if (1 & KeyState ('K'))
  652.   {
  653.     if (!am_client && !am_server)
  654.     {
  655.       compression /= 2.0;
  656.       PrintCompression();
  657.     }
  658.   }
  659.  
  660.   if (1 & KeyState ('v'))
  661.   {
  662.     player.viewlock = !player.viewlock;
  663.  
  664.     if (player.viewlock)
  665.     Cprint ("View LOCKED");
  666.     else
  667.     Cprint ("View UNLOCKED");
  668.   }
  669.  
  670.   if (1 & KeyState ('{'))
  671.   {
  672.     clipnear *= 0.75;
  673.     Cprint ("Near = %lf", clipnear);
  674.     Reshape (ScreenWidth, ScreenHeight);
  675.   }
  676.   if (1 & KeyState ('}'))
  677.   {
  678.     clipnear *= 1.25;
  679.     Cprint ("Near = %lf", clipnear);
  680.     Reshape (ScreenWidth, ScreenHeight);
  681.   }
  682.   if (1 & KeyState ('('))
  683.   {
  684.     clipfar *= 0.75;
  685.     Cprint ("Far = %lf", clipfar);
  686.     Reshape (ScreenWidth, ScreenHeight);
  687.   }
  688.   if (1 & KeyState (')'))
  689.   {
  690.     clipfar *= 1.25;
  691.     Cprint ("Far = %lf", clipfar);
  692.     Reshape (ScreenWidth, ScreenHeight);
  693.   }
  694. }
  695.  
  696. void PrintCompression()
  697. {
  698.   if (compression >= 1.0)
  699.   {
  700.     Cprint ("Compression %.0lfX", compression);
  701.   }
  702.   else
  703.   {
  704.     Cprint ("Compression %lfX", compression);
  705.   }
  706. }
  707.